package server;


import java.io.*;
import java.net.*;


/**
 * @author  Mattia
 */
public class Mappa {
	
	/* ATTRIBUTI */
	
	
	/**
	 * @uml.property  name="altezza"
	 */
	private static int altezza=40;
	/**
	 * @uml.property  name="larghezza"
	 */
	private static int larghezza=40;
	/**
	 * @uml.property  name="mappa"
	 * @uml.associationEnd  multiplicity="(0 -1)"
	 */
	protected Casella[][] mappa= new Casella [altezza][larghezza];
	
	
	/* COSTRUTTORE */
	public Mappa() {
		
	}
	
	
	/* METODI */
	
	/**
	 *  Assegna ad ogni casella della mappa il proprio tipo
	 */

	@SuppressWarnings("deprecation")
	public void inizializzaMappa(){
		
	
			    // DEFINIAMO IL PERCORSO AL FILE DA LEGGERE
		
			    File doc=new File("./src/server/Mappa.txt");
			    URL path=null;
			  
			    // CREAIAMO UN BLOCCO TRY CATCH
			    
			    try
			    {
			    	
			        path=doc.toURL(); 
			        doc=new File(path.getFile());
			        int i;
			        int c=0;
				    int r=0;
			      
			      
			      //APRIAMO LO STREAM DI INPUT
			      
			      InputStream is=path.openStream();
			      BufferedReader br=new BufferedReader(new InputStreamReader(is));

			      //LETTURA DEL FILE CON CICLO "DO WHILE"
			      
			      do
			      { 
			        i=br.read();
			        if (c>=larghezza){c=0; r++;}
			        	if ((char)i=='T' ||(char)i=='A'||(char)i=='C'||(char)i=='V'){
			        		if ((char)i=='T')
			        			{mappa[r][c]= new Terreno(r,c);}
			        		if ((char)i=='A')
			        			{mappa[r][c]= new Acqua(r,c);}
			        		if ((char)i=='C')
			        			{mappa[r][c]= new Carogna(r,c);}
			        		if ((char)i=='V')
			        			{mappa[r][c]= new Vegetazione(r,c);}
			        					
			       
			       c++;
			       }
			     }
			        
			      
			      while (i!=-1);
			      is.close();
			  
					
			
				}
			    
				//INTERCETTA EVENTUALI ECCEZIONI
			    
			    catch (MalformedURLException e)
			    {
			      System.out.println("Attenzione:" + e);
			    }
			    catch (IOException e)
			    {
			      System.out.println(e.getMessage());
			    } 
			  }
		
	
	

	//@ requires	pos_x>0 && pos_x<40 && pos_y>0 && pos_y<40;
	/** Restituisce la casella individuata dalle coordinate pos_x,pos_y
	 * 
	 * @param pos_x Posizione orizzontale della casella
	 * @param pos_y Posizione verticale della casella
	 * @return mappa[pos_x][pos_y] - Casella con coordinate pos_x,pos_y
	 */
	public Casella getCasella(int pos_x, int pos_y){
		return mappa[pos_x][pos_y];
	}
	
	//@ requires	pos_x>0 && pos_x<40 && pos_y>0 && pos_y<40;
	/** setta la casella individuata dalle coordinate pos_x,pos_y a tipo carogna
	 * 
	 * @param pos_x Posizione orizzontale della casella
	 * @param pos_y Posizione verticale della casella
	 */
	public void setACarogna(int pos_x, int pos_y){
		
		Carogna nuovo = new Carogna(pos_x,pos_y);
		mappa[pos_x][pos_y] = nuovo;
	}
	
	//@ requires	pos_x>0 && pos_x<40 && pos_y>0 && pos_y<40;
	/** setta la casella individuata dalle coordinate pos_x,pos_y a tipo semplice
	 * 
	 * @param pos_x Posizione orizzontale della casella
	 * @param pos_y Posizione verticale della casella
	 */
	public void setATerreno(int pos_x, int pos_y){
		
		Terreno nuovo = new Terreno(pos_x,pos_y);
		mappa[pos_x][pos_y] = nuovo;
	}
	
	/**
	 * Restituisce il valore dell'altezza della mappa
	 * @return  altezza - Altezza della mappa
	 * @uml.property  name="altezza"
	 */
	public static int getAltezza() {
		return altezza;
	}
	
	/**
	 * Restituisce il valore della larghezza della mappa
	 * @return  larghezza - Larghezza della mappa
	 * @uml.property  name="larghezza"
	 */
	public static int getLarghezza() {
		return larghezza;
	}
	

}
